package dto

type FirewallBaseInfo struct {
	Name       string `json:"name"`
	IsExist    bool   `json:"isExist"`
	IsActive   bool   `json:"isActive"`
	IsInit     bool   `json:"isInit"`
	IsBind     bool   `json:"isBind"`
	Version    string `json:"version"`
	PingStatus string `json:"pingStatus"`
}

type RuleSearch struct {
	PageInfo
	Info     string `json:"info"`
	Status   string `json:"status"`
	Strategy string `json:"strategy"`
	Type     string `json:"type" validate:"required"`
}

type FirewallOperation struct {
	Operation         string `json:"operation" validate:"required,oneof=start stop restart disablePing enablePing"`
	WithDockerRestart bool   `json:"withDockerRestart"`
}

type PortRuleOperate struct {
	ID        uint   `json:"id"`
	Operation string `json:"operation" validate:"required,oneof=add remove"`
	Chain     string `json:"chain"`
	Address   string `json:"address"`
	Port      string `json:"port" validate:"required"`
	Protocol  string `json:"protocol" validate:"required,oneof=tcp udp tcp/udp"`
	Strategy  string `json:"strategy" validate:"required,oneof=accept drop"`

	Description string `json:"description"`
}

type ForwardRuleOperate struct {
	ForceDelete bool `json:"forceDelete"`
	Rules       []struct {
		Operation  string `json:"operation" validate:"required,oneof=add remove"`
		Num        string `json:"num"`
		Protocol   string `json:"protocol" validate:"required,oneof=tcp udp tcp/udp"`
		Interface  string `json:"interface"`
		Port       string `json:"port" validate:"required"`
		TargetIP   string `json:"targetIP"`
		TargetPort string `json:"targetPort" validate:"required"`
	} `json:"rules"`
}

type UpdateFirewallDescription struct {
	Type     string `json:"type"`
	Chain    string `json:"chain"`
	SrcIP    string `json:"srcIP"`
	DstIP    string `json:"dstIP"`
	SrcPort  string `json:"srcPort"`
	DstPort  string `json:"dstPort"`
	Protocol string `json:"protocol"`
	Strategy string `json:"strategy" validate:"required,oneof=accept drop"`

	Description string `json:"description"`
}

type AddrRuleOperate struct {
	ID        uint   `json:"id"`
	Operation string `json:"operation" validate:"required,oneof=add remove"`
	Address   string `json:"address"  validate:"required"`
	Strategy  string `json:"strategy" validate:"required,oneof=accept drop"`

	Description string `json:"description"`
}

type PortRuleUpdate struct {
	OldRule PortRuleOperate `json:"oldRule"`
	NewRule PortRuleOperate `json:"newRule"`
}

type AddrRuleUpdate struct {
	OldRule AddrRuleOperate `json:"oldRule"`
	NewRule AddrRuleOperate `json:"newRule"`
}

type BatchRuleOperate struct {
	Type  string            `json:"type" validate:"required"`
	Rules []PortRuleOperate `json:"rules"`
}

type IptablesOp struct {
	Name    string `json:"name" validate:"required,oneof=1PANEL_INPUT 1PANEL_OUTPUT 1PANEL_BASIC"`
	Operate string `json:"operate" validate:"required,oneof=init-base init-forward init-advance bind-base unbind-base bind unbind"`
}

type IptablesRuleOp struct {
	Operation   string `json:"operation" validate:"required,oneof=add remove"`
	ID          uint   `json:"id"`
	Chain       string `json:"chain" validate:"required,oneof=1PANEL_BASIC 1PANEL_BASIC_BEFORE 1PANEL_INPUT 1PANEL_OUTPUT"`
	Protocol    string `json:"protocol"`
	SrcIP       string `json:"srcIP"`
	SrcPort     uint   `json:"srcPort"`
	DstIP       string `json:"dstIP"`
	DstPort     uint   `json:"dstPort"`
	Strategy    string `json:"strategy" validate:"required,oneof=accept drop reject"`
	Description string `json:"description"`
}

type IptablesBatchOperate struct {
	Rules []IptablesRuleOp `json:"rules"`
}

type IptablesChainStatus struct {
	IsBind          bool   `json:"isBind"`
	DefaultStrategy string `json:"defaultStrategy"`
}
